package com.compmov.webservice;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.ByteArrayBody;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONObject;

import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.util.Log;

import com.compmov.datamodel.Foto;

import com.compmov.datamodel.Lugar;
import com.compmov.datamodel.Persona;

import com.compmov.libraries.QueryParamDictionary;

import com.google.gson.Gson;

public class FotoWSClient {
	
	private WebServiceClient webService;
	private static final String TAG = "WEBSERVICE";


	public FotoWSClient(String WSName) {
		super();
		webService = new WebServiceClient("/rest/"+WSName);
	}


	public FotoWSClient(WebServiceClient webService) {
		super();
		this.webService = webService;
	}	
	
	private String uploadFoto(String path){
		// Obtener el nombre de la imagen
		String title = path.substring(path.lastIndexOf('/')+1,path.lastIndexOf('.'));
		//Crear bitmap de la imagen
		Bitmap bm = BitmapFactory.decodeFile(path);
		
		try {
			//Comprimir la imagen para que no sea tan pesada la carga al servicor
			ByteArrayOutputStream bos = new ByteArrayOutputStream();
			bm.compress(CompressFormat.JPEG, 75, bos);
			byte[] data = bos.toByteArray();
			HttpClient httpClient = new DefaultHttpClient();

			//Crear metodo post con la direccion de servicio
			String serviceURL = webService.getWebServiceUrl()+"/upload";
			HttpPost postRequest = new HttpPost(serviceURL);
			ByteArrayBody bab = new ByteArrayBody(data, title+".jpg");

			MultipartEntity reqEntity = new MultipartEntity(
					HttpMultipartMode.BROWSER_COMPATIBLE);

			reqEntity.addPart("uploaded", bab);

			postRequest.setEntity(reqEntity);
			//Se invoca el servicio
			HttpResponse response = httpClient.execute(postRequest);
			//Se lee el response
			BufferedReader reader = new BufferedReader(new InputStreamReader(
					response.getEntity().getContent(), "UTF-8"));
			String sResponse;
			StringBuilder s = new StringBuilder();

			while ((sResponse = reader.readLine()) != null) {
				s = s.append(sResponse);
			}
			return s.toString();
		} catch (Exception e) {
			// handle exception here
			Log.e(TAG, e.getMessage(), e);
			return null;
		}
	}
	
	public Foto subirFoto(Foto foto) throws WSClientException {

		//Subir la imagen al servidor y obtener la ruta donde este almacenada

		String newUrl = uploadFoto(foto.getUrl());
		if (newUrl==null) throw new WSClientException("ERROR AL SUBIR LA IMAGEN AL SERVIDOR");
		foto.setUrl(newUrl);
		
		Gson gson = new Gson();
		// Mapa de parametros para el servicio
		Log.d(TAG,"FOTO = "+foto);
		Map<String, String> params = new HashMap<String, String>();
		String jsonCad = gson.toJson(foto,Foto.class);
		params.put(QueryParamDictionary.FOTO_PARAM, jsonCad);

		Log.d(TAG, "Invocando");

		String response = webService.webPut("/subirFoto", params);
		Log.d(TAG, "RESPONSE = " + response);
		try {
			WSError error = gson.fromJson(response, WSError.class);
			// Si no hay ningun error se intenta parsear el contenido de la
			// respuesta
			if (error.getError_description() == null) {
				Foto fotoResponse = gson.fromJson(response, Foto.class);
				Log.d(TAG,fotoResponse+"");
				return fotoResponse;
			} else {
				Log.e(TAG, error + "");
				throw new WSClientException(error);
			}
		} catch (Exception e) {
			Log.d(TAG, e.getMessage());
			throw new WSClientException(e);
		}

	}
	
	public List<Foto> getFotos(int id_lugar) throws WSClientException {
		
		String response;
		Gson gson = new Gson();
		JSONObject jsonObj;
		JSONArray jsonFotos;
		JSONObject foto;
		Foto foto2;
		
		List<Foto> fotos = new LinkedList<Foto>();
		
		Map<String,String> params = new HashMap<String,String>();
		Log.d(TAG,"Iniciando WEBSERVICE...");		
		params.put("id_lugar", String.valueOf(id_lugar));
		
		response = webService.webGet("/getFotos", params);
		Log.d(TAG,"Response: "+response);
		
		try {
			WSError error = gson.fromJson(response, WSError.class);
			if (error.getError_description() == null){
				try {
								
				jsonObj = new JSONObject(response);
				jsonFotos = jsonObj.optJSONArray("foto");
				if (jsonFotos != null){
					for (int i=0; i<jsonFotos.length();i++){
						foto = jsonFotos.getJSONObject(i);
						foto2 = gson.fromJson(foto.toString(), Foto.class);
						foto2.setUrl(WebServiceClient.getServerURL()+
								foto2.getUrl());
						foto2.getPersona().setFotografia(WebServiceClient.getServerURL()+
								foto2.getPersona().getFotografia());
						fotos.add(foto2);
					}
				}else{
					foto = jsonObj.getJSONObject("foto");
					foto2 = gson.fromJson(foto.toString(), 
							Foto.class);
					if (foto2.getId()!=0){
						foto2.setUrl(WebServiceClient.getServerURL()+
								foto2.getUrl());
						foto2.getPersona().setFotografia(WebServiceClient.getServerURL()+
								foto2.getPersona().getFotografia());
						fotos.add(foto2);
						Log.d(TAG,"Foto:"+foto2);
					}						
				}				
				Log.d(TAG, "Fotos: "+fotos);
				return fotos;
				} catch (Exception e) {
					// TODO: handle exception
					Log.e(TAG, e.getMessage(), e);
					throw new WSClientException(e);
				}
			}else{
				Log.e(TAG, error.getError_description()+"");
				throw new WSClientException(error);
			}
			
		} catch (Exception e) {
			// TODO: handle exception
			Log.e(TAG, e.getMessage(), e);
			throw new WSClientException(e);
		}				
	}

}
